Dart eval:compileIdentifierAsReference
介绍
方法签名:
Reference compileIdentifierAsReference(Identifier id, CompilerContext ctx) {
根据《Dart Analyzer:Identifier》可知,Identifier 有两种类型:SimpleIdentifier 和 PrefixedIdentifier,分别处理。
SimpleIdentifier 编译
SimpleIdentifier 编译方式很简单,直接创建《Dart eval:IdentifierReference》实体容纳即可。
PrefixedIdentifier 编译
PrefixedIdentifier 编译要更加复杂一些。
首先,prefix 中可能包含不只一个(a.b),可能有多个(a.b.c.d),因此首先对 prefix 递归,把一层一层的关系处理好:
final L = compileIdentifier(id.prefix, ctx);
之后进行了两个校验:用于校验 校验1:
if (ctx.instanceDeclarationsMap.containsKey(L.type.file)) {
校验2:
if (!ctx.instanceDeclarationsMap[L.type.file]!.containsKey(L.type.name)) {
如果校验不满足,会抛出两个异常:
- 'Trying to access ${id.prefix}.$idn on ${L.type}, which is not a class'
- 'Bridge class ${L.type} does not have method/field/getter/setter "$idn"'